/*
 * Copyright [2022] [https://www.xiaonuo.vip]
 *
 * Snowy采用APACHE LICENSE 2.0开源协议，您在使用过程中，需要注意以下几点：
 *
 * 1.请不要删除和修改根目录下的LICENSE文件。
 * 2.请不要删除和修改Snowy源码头部的版权声明。
 * 3.本项目代码可免费商业使用，商业使用请保留源码和相关描述文件的项目出处，作者声明等。
 * 4.分发源码时候，请注明软件出处 https://www.xiaonuo.vip
 * 5.不可二次分发开源参与同类竞品，如有想法可联系团队xiaonuobase@qq.com商议合作。
 * 6.若您的项目无法满足以上几点，需要更多功能代码，获取Snowy商业授权许可，请在官网购买授权，地址为 https://www.xiaonuo.vip
 */
package vip.xiaonuo.biz.modular.simple.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollStreamUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import vip.xiaonuo.biz.modular.simple.entity.BizSimple;
import vip.xiaonuo.biz.modular.simple.mapper.BizSimpleMapper;
import vip.xiaonuo.biz.modular.simple.param.BizSimpleAddParam;
import vip.xiaonuo.biz.modular.simple.param.BizSimpleEditParam;
import vip.xiaonuo.biz.modular.simple.param.BizSimpleIdParam;
import vip.xiaonuo.biz.modular.simple.param.BizSimplePageParam;
import vip.xiaonuo.biz.modular.simple.service.BizSimpleService;
import vip.xiaonuo.common.enums.CommonSortOrderEnum;
import vip.xiaonuo.common.exception.CommonException;
import vip.xiaonuo.common.page.CommonPageRequest;

import java.lang.reflect.Field;
import java.util.List;
import java.util.function.Function;

/**
 * 简单业务Service接口实现类
 *
 * @author albed
 * @date  2022/12/03 21:20
 **/
@Service
public class BizSimpleServiceImpl extends ServiceImpl<BizSimpleMapper, BizSimple> implements BizSimpleService {

    @Override
    public Page<BizSimple> page(BizSimplePageParam bizSimplePageParam) {
        QueryWrapper<BizSimple> queryWrapper = new QueryWrapper<>();
        // 提前判空为了减少if嵌套层级
        // isAllNotEmpty中的条件没有逻辑关系 相当于 &
        // 判断【排序方式】和【排序字段】都不为空
        if(ObjectUtil.isAllNotEmpty(bizSimplePageParam.getSortOrder(), bizSimplePageParam.getSortField())
                // 如果要判断BizSimple中是否含有该字段 （则必须利用&&的“短路”）
                // && ObjectUtil.isNotEmpty(ReflectUtil.getField(BizSimple.class, bizSimplePageParam.getSortField()))
        ) {
            // 校验【排序方式】是否符合规则
            CommonSortOrderEnum.validate(bizSimplePageParam.getSortOrder());



            // 1、判断实体当中是否存在该字段 ，字段在实体当中不存在，说明数据库中就不存在该字段
            // 通过【排列字段】映射获取字段属性
            Field field = ReflectUtil.getField(BizSimple.class, bizSimplePageParam.getSortField());
            if (ObjectUtil.isEmpty(field)){
                throw new CommonException("字段【{}】在数据库中，不存在!", bizSimplePageParam.getSortField());
            }

            // 2、判断该字段的@TableField(exist = false) 如果是false 那么该字段在数据库中也不存在
            // 获取tableField注解属性
            TableField tableField = field.getAnnotation(TableField.class);

            // 如果有注解 并且 注解为空或false
            if (ObjectUtil.isNotEmpty(tableField) && !tableField.exist()){
                throw new CommonException("字段【{}】在数据库中，不存在!!", bizSimplePageParam.getSortField());
            }
            queryWrapper.orderBy(
                    // 1、注解不存在；2、注解存在但值为true 结合上下文可直接写成true
                    ObjectUtil.isEmpty(tableField) || (ObjectUtil.isNotEmpty(tableField) && tableField.exist()),
                    bizSimplePageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()),
                    StrUtil.toUnderlineCase(bizSimplePageParam.getSortField())
            );

        }else {
            queryWrapper.lambda().orderByAsc(BizSimple::getId);
        }
        return this.page(CommonPageRequest.defaultPage(), queryWrapper);
    }

    @Override
    public void add(BizSimpleAddParam bizSimpleAddParam) {
        BizSimple bizSimple = BeanUtil.toBean(bizSimpleAddParam, BizSimple.class);
        this.save(bizSimple);
    }

    @Override
    public void edit(BizSimpleEditParam bizSimpleEditParam) {
        BizSimple bizSimple = this.queryEntity(bizSimpleEditParam.getId());
        BeanUtil.copyProperties(bizSimpleEditParam, bizSimple);
        this.updateById(bizSimple);
    }

    @Transactional(rollbackFor = Exception.class)
    @Override
    public void delete(List<BizSimpleIdParam> bizSimpleIdParamList) {
        // 执行删除
        this.removeBatchByIds(CollStreamUtil.toList(bizSimpleIdParamList, BizSimpleIdParam::getId));
    }

    @Override
    public BizSimple detail(BizSimpleIdParam bizSimpleIdParam) {
        return this.queryEntity(bizSimpleIdParam.getId());
    }

    @Override
    public BizSimple queryEntity(String id) {
        BizSimple bizSimple = this.getById(id);
        if(ObjectUtil.isEmpty(bizSimple)) {
            throw new CommonException("简单业务不存在，id值为：{}", id);
        }
        return bizSimple;
    }
}
